home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / UTIL / TouchMe 1.1.1.sit / touchMe 1.11 Folder / CW9 PP source / source / CTouchMeAppleEvents.cp < prev    next >
Text File  |  1996-08-08  |  12KB  |  400 lines

  1. // ==================================================
  2. //    CTouchMeAppleEvents.cp
  3. //    a part of CTouchMeApp.cp
  4. //    Copyright (C) 1996 Mizutori Tetsuya, July 4 1996.
  5. // ==================================================
  6. //    All documents are pretty-printed in Geneva 10-point font.
  7.  
  8.  
  9. #include <UAppleEventsMgr.h>
  10. #include <UExtractFromAEDesc.h>
  11.  
  12.  
  13. #include "touchMeConstants.h"
  14. #include "CTouchMeAppleEvents.h"
  15. #include "CTouchMeApp.h"
  16. #include "CTouchMePref.h"
  17. #include "CTouchMeDialog.h"
  18. #include "UFileInfo.h"
  19.  
  20. extern CTouchMePref *    gPref;
  21. extern CTouchMeDialog *    gDialog;
  22.  
  23. #define longDateTimeHi( a )    (((LongDateCvt *) &(a))->hl.lHigh)
  24. #define longDateTimeLo( a )    (((LongDateCvt *) &(a))->hl.lLow)
  25.  
  26.  
  27. // Making a 'TheLongDateTime()' function from a template.
  28. // See also examples in the source code 'UExtractFromAEDesc.cp'.
  29.  
  30. #ifdef COMMENT
  31. static void
  32. CTouchMeApp::TheLongDateTime(
  33.     const AEDesc    &inDesc,
  34.     LongDateTime    &outValue );
  35. #endif // COMMENT
  36.  
  37. // --------------------------------------------------
  38. #undef        Extractor_Name
  39. #undef        C_DataType
  40. #undef        AE_DataType
  41.  
  42. #define        Extractor_Name        TheLongDateTime
  43. #define        C_DataType        LongDateTime
  44. #define        AE_DataType        typeLongDateTime
  45.  
  46. #undef        UExtractFromAEDesc
  47. #define        UExtractFromAEDesc    CTouchMeApp
  48. #include <AEDescExtractor.t>
  49. #undef        UExtractFromAEDesc
  50. // --------------------------------------------------
  51.  
  52.  
  53.  
  54. // --------------------------------------------------
  55. //        ・ HandleAppleEvent
  56. // --------------------------------------------------
  57. //    Respond to an AppleEvent
  58.  
  59. void
  60. CTouchMeApp::HandleAppleEvent(
  61.     const AppleEvent    &    inAppleEvent,
  62.     AppleEvent    &        outAEReply,
  63.     AEDesc &            outResult,
  64.     long                inAENumber )
  65. {
  66.  
  67.     switch ( inAENumber ) {
  68.         case ae_GetPrefs:
  69.             HandleGetPrefs( inAppleEvent, outAEReply, outResult );
  70.             break;
  71.  
  72.         case ae_SetPrefs:
  73.             HandleSetPrefs( inAppleEvent, outAEReply, outResult );
  74.             break;
  75.  
  76.         case ae_LoadPrefs:
  77.             HandleLoadPrefs( inAppleEvent, outAEReply, outResult );
  78.             break;
  79.  
  80.         case ae_SavePrefs:
  81.             HandleSavePrefs( inAppleEvent, outAEReply, outResult );
  82.             break;
  83.  
  84.         case ae_Touch:
  85.             HandleTouch( inAppleEvent, outAEReply, outResult );
  86.             break;
  87.  
  88.         case ae_Fetch:
  89.             HandleFetch( inAppleEvent, outAEReply, outResult );
  90.             break;
  91.  
  92.         default:
  93.             LDocApplication::HandleAppleEvent(
  94.                         inAppleEvent, outAEReply, outResult, inAENumber );
  95.             break;
  96.     }
  97. }
  98.  
  99.  
  100. // --------------------------------------------------
  101. //        ・ HandleGetPrefs
  102. // --------------------------------------------------
  103.  
  104. void
  105. CTouchMeApp::HandleGetPrefs(
  106.     const AppleEvent    &inAppleEvent,
  107.     AppleEvent        &outAEReply,
  108.     AEDesc        &outResult )
  109. {
  110.     ETouchType    theTouchType;    // 'creation' or 'modification' type
  111.     OSErr        err;
  112.  
  113.     // Get the 1st required parameter as 'typeEnumerated'.
  114.     StAEDescriptor    theRequiredDesc;
  115.     theRequiredDesc.GetParamDesc( inAppleEvent, keyDirectObject, typeEnumerated );
  116.     OSType    theEnumValue;
  117.     UExtractFromAEDesc::TheEnum( theRequiredDesc.mDesc, theEnumValue );
  118.     switch ( theEnumValue ) {
  119.         case kEnumType_Creation:
  120.             theTouchType = touchType_CreationDate;
  121.             break;
  122.         case kEnumType_Modification:
  123.             theTouchType = touchType_ModificationDate;
  124.             break;
  125.         default:
  126.             ThrowIfOSErr_( errAEWrongDataType );    // Error.
  127.             break;
  128.     }
  129.  
  130.     // Error if there are more parameters.
  131.     UAppleEventsMgr::CheckForMissedParams( inAppleEvent );
  132.  
  133.  
  134.     // Dispose the original descriptor given by the system.
  135.     // Instead, create my own descriptor, a record type with true option, otherwise a list type.
  136.     ::AEDisposeDesc( &outResult );
  137.     outResult.dataHandle = nil;
  138.     //err = ::AECreateDesc(typeLongInteger, &theSize, sizeof(Int32), &outResult);
  139.     err = ::AECreateList( nil, 0, true, &outResult );
  140.     ThrowIfOSErr_( err );
  141.  
  142.  
  143.     // If dialog window is open, then read the settings from the dialog.
  144.     if ( gDialog != nil ) gDialog->InspectDialog( *gPref );
  145.  
  146.     // Return the gPref data as an AppleEvent record.
  147.     // 1. Enabled
  148.         Boolean        theEnabled = gPref->GetEnabled( theTouchType );
  149.  
  150.     // 2. Flag
  151.         OSType        theFlag;
  152.         switch ( gPref->GetFlagNumb( theTouchType ) ) {
  153.             case touchFlag_Current:
  154.                 theFlag = kEnumFlag_Current; break;
  155.             case touchFlag_Direct:
  156.                 theFlag = kEnumFlag_Excact; break;
  157.             case touchFlag_First:
  158.                 theFlag = kEnumFlag_First; break;
  159.             case touchFlag_Second:
  160.                 theFlag = kEnumFlag_FirstSet; break;
  161.             default:
  162.                 theFlag = typeNull; break;
  163.         }
  164.  
  165.     // 3. Value
  166.         LongDateTime    theDateTimeSecs;
  167.         longDateTimeHi( theDateTimeSecs ) = 0;
  168.         longDateTimeLo( theDateTimeSecs ) = gPref->GetDateTime( theTouchType );
  169.  
  170.     // Prepare to create members of descriptor record.
  171.     StAEDescriptor        theDescEnabled( (Boolean) theEnabled );
  172.     StAEDescriptor        theDescFlag( typeEnumerated, &theFlag, sizeof(OSType) );
  173.     StAEDescriptor        theDescDate( typeLongDateTime, &theDateTimeSecs, sizeof(LongDateTime) );
  174.  
  175.     // Insert the members into to the descriptor record.
  176.     UAEDesc::AddKeyDesc( &outResult, pPref_Enabled, theDescEnabled.mDesc );
  177.     UAEDesc::AddKeyDesc( &outResult, pPref_Flag, theDescFlag.mDesc );
  178.     UAEDesc::AddKeyDesc( &outResult, pPref_Value, theDescDate.mDesc );
  179. }
  180.  
  181.  
  182. // --------------------------------------------------
  183. //        ・ HandleSetPrefs
  184. // --------------------------------------------------
  185.  
  186. void
  187. CTouchMeApp::HandleSetPrefs(
  188.     const AppleEvent    &inAppleEvent,
  189.     AppleEvent        &outAEReply,
  190.     AEDesc        &outResult )
  191. {
  192.     ETouchType    theTouchType;    // 'creation' or 'modification'
  193.     OSErr        err;
  194.  
  195.     // Get the 1st required parameter as 'typeEnumerated'.
  196.     StAEDescriptor    theRequiredDesc;
  197.     theRequiredDesc.GetParamDesc( inAppleEvent, keyDirectObject, typeEnumerated );
  198.     OSType    theEnumValue;
  199.     UExtractFromAEDesc::TheEnum( theRequiredDesc.mDesc, theEnumValue );
  200.     switch ( theEnumValue ) {
  201.         case kEnumType_Creation:
  202.             theTouchType = touchType_CreationDate;
  203.             break;
  204.         case kEnumType_Modification:
  205.             theTouchType = touchType_ModificationDate;
  206.             break;
  207.         default:
  208.             ThrowIfOSErr_( errAEWrongDataType );    // Error.
  209.             break;
  210.     }
  211.  
  212.     // Get the 2nd required parameter as 'typeAERecord'.
  213.     StAEDescriptor    theDescData;
  214.     theDescData.GetParamDesc( inAppleEvent, keyAEData, typeAERecord );
  215.     //theDescData.GetParamDesc( inAppleEvent, keyAEData, typeWildCard );
  216.  
  217.     // Error if there are more parameters.
  218.     UAppleEventsMgr::CheckForMissedParams( inAppleEvent );
  219.  
  220.  
  221.     // Prepare to create members of descriptor record.
  222.     StAEDescriptor        theDescEnabled;
  223.     StAEDescriptor        theDescFlag;
  224.     StAEDescriptor        theDescDate;
  225.  
  226.     // Get descriptors from the descriptor record.
  227.     theDescEnabled.GetOptionalParamDesc( theDescData.mDesc, pPref_Enabled, typeBoolean );
  228.     theDescFlag.GetOptionalParamDesc( theDescData.mDesc, pPref_Flag, typeEnumerated );
  229.     theDescDate.GetOptionalParamDesc( theDescData.mDesc, pPref_Value, typeLongDateTime );
  230.  
  231.     // Read the gPref data from an AppleEvent descriptor.
  232.     // 1. Enabled
  233.         Boolean        theEnabled = gPref->GetEnabled( theTouchType );
  234.         if ( theDescEnabled.mDesc.descriptorType != typeNull )
  235.             UExtractFromAEDesc::TheBoolean( theDescEnabled.mDesc, theEnabled );
  236.         gPref->SetEnabled( theTouchType, theEnabled );
  237.  
  238.     // 2. Flag
  239.         ETouchFlag        theFlag = gPref->GetFlagNumb( theTouchType );
  240.         OSType        theAEFlag = typeNull;
  241.         if ( theDescFlag.mDesc.descriptorType != typeNull )
  242.             UExtractFromAEDesc::TheEnum( theDescFlag.mDesc, theAEFlag );
  243.         switch ( theAEFlag ) {
  244.             case kEnumFlag_Current:    theFlag = touchFlag_Current; break;
  245.             case kEnumFlag_Excact:    theFlag = touchFlag_Direct; break;
  246.             case kEnumFlag_First:        theFlag = touchFlag_First; break;
  247.             case kEnumFlag_FirstSet:    theFlag = touchFlag_Second; break;
  248.             default:    break;
  249.         }
  250.         gPref->SetFlagNumb( theTouchType, theFlag );
  251.  
  252.     // 3. Value
  253.         LongDateTime    theDateTimeSecs;
  254.         longDateTimeHi( theDateTimeSecs ) = 0;
  255.         longDateTimeLo( theDateTimeSecs ) = gPref->GetDateTime( theTouchType );
  256.         if ( theDescDate.mDesc.descriptorType != typeNull )
  257.             CTouchMeApp::TheLongDateTime( theDescDate.mDesc, theDateTimeSecs );
  258.         gPref->SetDateTime( theTouchType, longDateTimeLo( theDateTimeSecs ) );
  259.  
  260.     // If dialog window is open, then setup the dialog according to the preferences.
  261.     if ( gDialog != nil )  gDialog->SetupDialog( *gPref );
  262. }
  263.  
  264.  
  265. // --------------------------------------------------
  266. //        ・ HandleLoadPrefs
  267. // --------------------------------------------------
  268.  
  269. void
  270. CTouchMeApp::HandleLoadPrefs(
  271.     const AppleEvent    &inAppleEvent,
  272.     AppleEvent        &outAEReply,
  273.     AEDesc        &outResult )
  274. {
  275.     gPref->LoadPrefData();
  276.  
  277.     // If dialog window is open, then setup the dialog according to the preferences.
  278.     if ( gDialog != nil )  gDialog->SetupDialog( *gPref );    
  279. }
  280.  
  281.  
  282. // --------------------------------------------------
  283. //        ・ HandleSavePrefs
  284. // --------------------------------------------------
  285.  
  286. void
  287. CTouchMeApp::HandleSavePrefs(
  288.     const AppleEvent    &inAppleEvent,
  289.     AppleEvent        &outAEReply,
  290.     AEDesc        &outResult )
  291. {
  292.     // If dialog window is open, then read the settings from the dialog.
  293.     if ( gDialog != nil ) gDialog->InspectDialog( *gPref );
  294.  
  295.     gPref->SavePrefData();
  296. }
  297.  
  298.  
  299. // --------------------------------------------------
  300. //        ・ HandleTouch
  301. // --------------------------------------------------
  302.  
  303. void
  304. CTouchMeApp::HandleTouch(
  305.     const AppleEvent    &inAppleEvent,
  306.     AppleEvent        &outAEReply,
  307.     AEDesc        &outResult )
  308. {
  309.     OSErr        err;
  310.  
  311.     // Get the 1st required parameter as 'typeAEList'.
  312.     StAEDescriptor    theDocListDesc;
  313.     theDocListDesc.GetParamDesc( inAppleEvent, keyDirectObject, typeAEList );
  314.  
  315.     long    theCount;
  316.     err = ::AECountItems( &(theDocListDesc.mDesc), &theCount );
  317.     ThrowIfOSErr_( err );
  318.  
  319.     for ( long index = 1; index <= theCount; index++ ) {
  320.         AEKeyword        theKey;
  321.         DescType        theType;
  322.         FSSpec        theFileSpec;
  323.         Size            theSize;
  324.         err = ::AEGetNthPtr( &(theDocListDesc.mDesc), index, typeFSS,
  325.                 &theKey, &theType, (Ptr) &theFileSpec, sizeof(FSSpec), &theSize );
  326.         ThrowIfOSErr_( err );
  327.  
  328.         OpenDocument( &theFileSpec );
  329.     }
  330. }
  331.  
  332.  
  333. // --------------------------------------------------
  334. //        ・ HandleFetch
  335. // --------------------------------------------------
  336.  
  337. void
  338. CTouchMeApp::HandleFetch(
  339.     const AppleEvent    &inAppleEvent,
  340.     AppleEvent        &outAEReply,
  341.     AEDesc        &outResult )
  342. {
  343.     OSErr        err;
  344.  
  345.     unsigned long    theCreationDate, theModificationDate;
  346.     ::GetDateTime( &theCreationDate );
  347.     ::GetDateTime( &theModificationDate );
  348.  
  349.     // Get the 1st required parameter as 'typeAEList'.
  350.     StAEDescriptor    theDocListDesc;
  351.     theDocListDesc.GetParamDesc( inAppleEvent, keyDirectObject, typeAEList );
  352.  
  353.     long    theCount;
  354.     err = ::AECountItems( &(theDocListDesc.mDesc), &theCount );
  355.     ThrowIfOSErr_( err );
  356.  
  357.     for ( long index = 1; index <= theCount; index++ ) {
  358.         AEKeyword        theKey;
  359.         DescType        theType;
  360.         FSSpec        theFileSpec;
  361.         Size            theSize;
  362.         err = ::AEGetNthPtr( &(theDocListDesc.mDesc), index, typeFSS,
  363.                 &theKey, &theType, (Ptr) &theFileSpec, sizeof(FSSpec), &theSize );
  364.         ThrowIfOSErr_( err );
  365.  
  366.         UFileInfo::GetFSSpecDateTime( theFileSpec, theCreationDate, theModificationDate );        
  367.     }    
  368.  
  369.     gPref->SetDateTime( touchType_CreationDate, theCreationDate );
  370.     gPref->SetDateTime( touchType_ModificationDate, theModificationDate );
  371.  
  372.     // If dialog window is open, then setup the dialog according to the preferences.
  373.     if ( gDialog != nil )  gDialog->SetupDialog( *gPref );
  374.  
  375.     // Dispose the original descriptor given by the System.
  376.     // Instead, create my own descriptor, a record type with true option, otherwise a list type.
  377.     ::AEDisposeDesc( &outResult );
  378.     outResult.dataHandle = nil;
  379.     //err = ::AECreateDesc(typeLongInteger, &theSize, sizeof(Int32), &outResult);
  380.     err = ::AECreateList( nil, 0, true, &outResult );
  381.     ThrowIfOSErr_( err );
  382.  
  383.     LongDateTime    theCrDateTimeSecs, theMdDateTimeSecs;
  384.     longDateTimeHi( theCrDateTimeSecs ) = 0;
  385.     longDateTimeLo( theCrDateTimeSecs ) = theCreationDate;
  386.     longDateTimeHi( theMdDateTimeSecs ) = 0;
  387.     longDateTimeLo( theMdDateTimeSecs ) = theModificationDate;
  388.  
  389.     // Prepare to create members of descriptor record.
  390.     StAEDescriptor        theCrDateDesc( typeLongDateTime, &theCrDateTimeSecs, sizeof(LongDateTime) );
  391.     StAEDescriptor        theMdDateDesc( typeLongDateTime, &theMdDateTimeSecs, sizeof(LongDateTime) );
  392.  
  393.     // Insert the members into to the descriptor record.
  394.     UAEDesc::AddKeyDesc( &outResult, pStamp_Creation, theCrDateDesc.mDesc );
  395.     UAEDesc::AddKeyDesc( &outResult, pStamp_Modification, theMdDateDesc.mDesc );
  396. }
  397.  
  398.  
  399. // end of program
  400.